home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Merciful 5
/
Merciful - Disc 5.iso
/
software
/
p
/
pcqpascalv1.2d.lha
/
Examples2
/
DxBoot
/
DxBoot.p
< prev
Wrap
Text File
|
1997-05-06
|
11KB
|
476 lines
Program DxBoot;
{$I "include:exec/IO.i" } { * Version 1.2, 22.12.1992 * }
{$I "include:exec/Memory.i" } { * (C) by "Diesel" Bernd * }
{$I "include:exec/Devices.i" } { * Künnen, D-4477 Twist * }
{$I "include:exec/ExecBase.i" }
{$I "include:Utils/IOUtils.i" }
{$I "include:libraries/dos.i" }
{$I "include:utils/stringlib.i" }
{$I "include:utils/parameters.i" }
CONST
CMD_MOTOR = 9; { ist nicht in execIO.i def., }
CMD__Null = 0;
CMD__Kill = 1;
CMD__Read = 2;
CMD__Write = 3;
CMD__Chk = 4;
CMD__inst = 5;
CMD__Cmp = 6;
CMD__Type = 7; { * Nummern der einzelnen * }
CMD__Help = 8; { * Dxboot-Kommandos * }
CMD__Test = 9;
on = 1;
off = 0;
dev : String = "trackdisk.device";
ErrorTD_IO : String = " Error on trackdisk-IO\n";
DosErr_Rf : String = " Error reading file\n";
DosErr_Wf : String = " Error writing file\n";
Type
BB = Array[0..1023] Of Byte; { * 1 Bootblock = 1024 Bytes * }
BBPtr = ^BB;
VAR
comm,
i : Short;
ok,
dfx : Integer;
ArgStr : String;
Handle : FileHandle;
BB1,
BB2 : BBPtr;
{ --- Zum sauberen Verlassen des Programms, egal, von wo ! --- }
Procedure Cleanexit(why : String; RT : Integer);
Begin
IF handle <>NIL then DOSClose(handle); { --- File schließen --- }
IF BB1 <>NIL then FreeMem(BB1,1024); { --- ChipMem freigeben --- }
IF why<>NIL then begin { --- Wenn Fehler: --- }
writeln(why);
If RT=5 then write("\nUsage : DxBoot cmd unit[0..3] <filename>\n",
"Type DxBoot ? for help\n\n");
Delay(100); { --- 2 s warten --- }
end;
Exit(RT);
End;
{ --- HexDump des BB`s ausgeben --- }
Procedure DumpBB;
Const
hex : ARRAY[0..15] OF Char = ('0123456789ABCDEF');
Var
BW : Byte;
k,j : Short;
Buf : String;
Begin
k:=0; { --- Setup --- }
Buf:=AllocString(70);
Buf[48]:=' '; { --- Leerzeichen --- }
Buf[49]:=' ';
Buf[66]:=chr(10); { --- Return & linefeed --- }
Buf[67]:=chr(0); { --- Abschlußbyte/Str.=0 --- }
For i:=1 to 64 Do BEGIN { --- 64 Zeile zu 16 Bytes --- }
For j:=0 to 15 Do Begin
BW:=BB1^[k];
Buf[j*3]:=' '; { --- Leerzeichen --- }
Buf[j*3+1]:=hex[BW DIV 16]; { --- Byte-hälfte high ---}
Buf[j*3+2]:=hex[BW MOD 16]; { --- Byte-hälfte low --- }
IF ((BW > 31) AND (BW < 123)) then
Buf[50+j]:=chr(BW)
ELSE { --- Ggf. (A..z) --- }
Buf[50+j]:='.'; { --- sonst . --- }
inc(k); { --- k um 1 erhöhen --- }
End;
write(Buf); { --- Zeile ausgeben --- }
End;
end;
Procedure InstantBB(bbm : BBPtr; v : Short);
{ --- Trägt in bbm^ einen BB ein --- }
{ --- je nach SYSversion 1.3/2.0 --- }
Const
BB13 : ARRAY[0..48] OF Byte = ( $44, $4F, $53, $00, $C0, $20, $0F, $19,
$00, $00, $03, $70, $43, $FA, $00, $18,
$4E, $AE, $FF, $A0, $4A, $80, $67, $0A,
$20, $40, $20, $68, $00, $16, $70, $00,
$4E, $75, $70, $FF, $60, $FA, $64, $6F,
$73, $2E, $6C, $69, $62, $72, $61, $72,
$79, );
BB20 : ARRAY[0..92] OF Byte = ( $44, $4F, $53, $00, $E3, $3D, $0E, $73,
$00, $00, $03, $70, $43, $FA, $00, $3E,
$70, $25, $4E, $AE, $FD, $D8, $4A, $80,
$67, $0C, $22, $40, $08, $E9, $00, $06,
$00, $22, $4E, $AE, $FE, $62, $43, $FA,
$00, $18, $4E, $AE, $FF, $A0, $4A, $80,
$67, $0A, $20, $40, $20, $68, $00, $16,
$70, $00, $4E, $75, $70, $FF, $4E, $75,
$64, $6F, $73, $2E, $6C, $69, $62, $72,
$61, $72, $79, $00, $65, $78, $70, $61,
$6E, $73, $69, $6F, $6E, $2E, $6C, $69,
$62, $72, $61, $72, $79 );
BBNB : ARRAY[0..2] OF Byte = ( $44, $4f, $53 );
Var
MyExecBasePtr : ExecBasePtr;
j : short;
Begin
If v = 0 then Begin
MyExecBasePtr:=Address(4);
If MyExecBasePtr^.SoftVer < 36 { --- Kick 1.3 ? --- }
then v := 13
else v := 20;
End;
If v = 13 then
for j:=0 to 48 do bbm^[j]:=BB13[j]; { --- 1.3-BB kopieren --- }
If v = 20 then
for j:=0 to 92 do bbm^[j]:=BB20[j]; { --- 2.0-BB kopieren --- }
If v = -1 then
for j:=0 to 2 do bbm^[j]:=BBNB[j]; { --- Not booting Disk --- }
for j:=j to 1023 do bbm^[j]:=0; { --- mit 0 auffüllen --- }
End;
{ ------- Bootblock-Ein/Ausgabe ------- }
Function RWBB(unit: Integer; cmd: Short; mem: Address):Boolean;
PROCEDURE Motor(iostdr:IOStdReqPtr; switch:Integer);
Var { dfx-Motor an/aus }
okm : Integer;
BEGIN
iostdr^.io_Command:=CMD_MOTOR; { Motor schalten }
iostdr^.io_Length:=switch; { on/off übergeben }
okm:=DoIO(iostdr); { GO ! }
END; { Motor }
Var
myReq : IOStdReqPtr; { zur Kommun. mit dem }
myPort : MsgPortPtr; { trackdisk.device }
Begin
myPort:=CreatePort(NIL,0); { Nachrichtenport des Laufwerks }
myReq:=CreateStdIO(myPort); { Kommunikationsport einrichten }
ok:=OpenDevice( dev, unit, myReq, 0 ); { TrackDisk öffnen }
IF ok=0 THEN BEGIN
With myReq^ do begin
io_Data := mem; { Speicherbereich }
io_Offset := 0; { Offset = Block 0 }
io_Length := 1024; { 1024 bytes }
io_Command := CMD_CLEAR; { zuerst Trackbuffer löschen }
end;
ok:=DoIO(myReq);
If ok=0 then begin { wenn gelöscht, dann }
myReq^.io_command := cmd; { BB schreiben/lesen }
ok:=DoIO(myReq);
If (ok=0) AND (cmd =CMD__Write) then begin
myReq^.io_Command := CMD_UPDATE;
ok:=DoIO(myReq); { zum Schreiben "updaten" }
end; { d.h. Trackbuffer -> Disk }
end;
If comm = CMD__Test Then { Bootblock ausführen : }
Begin
{$A
_jumpIntoBBcode:
move.l 4,a6 ; execbase in a6
move.l -4(a5),a1 ; IOsStdReqPtr in a1
move.l 8(a5),a2 ; ^BB in Mem
jsr 12(a2) ; 'starte' BB
}
End;
Motor(myReq,off); { Motor aus & fertig }
CloseDevice(myReq); { Device schließen }
DeleteStdIO(myReq); { IOReq entfernen }
DeletePort(myPort); { MsgPort entfernen }
If ok=0 then RWBB:=TRUE else RWBB:=False;
End Else RWBB:=FALSE;
End;
{ --- File-Ein/Ausgabe --- }
Function FileIO(cmd: Short; hdl: FileHandle; mem: Address): Boolean;
Begin
CASE cmd of
Cmd__Read : ok:=DOSRead(hdl,mem,1024); { BB aus Datei }
Cmd__Write : ok:=DOSWrite(hdl,mem,1024); { BB sichern }
END;
IF ok<>1024 { Bei Fehler Flase zurück }
then FileIO:=False
else FileIO:=True;
End;
{ --- File je nach Bedarf öffnen, zur Ein/Ausgabe --- }
Procedure OpenFile(Mode: Integer);
begin
GetParam(3,ArgStr);
If strlen(ArgStr)=0 then Cleanexit(" No filename",5);
handle:=DosOpen(ArgStr, Mode);
If handle=NIL then CleanExit(" Could not open IO-File\n",10);
end;
{ ------ Compare Bootblocks - gibt False zurück, wenn different ----- }
Function CMPBB( c1, c2 : BBPtr) : Boolean;
Var
z : Short;
Begin
For z:=0to 1023 do
If c1^[z] <> c2^[z] then CMPBB := False;
CMPBB := True;
End;
{
-------------------- MAIN -----------------------
}
BEGIN
write("
DxBoot 1.2, (C)1992 by Diesel.
\n It`s Freeware!
\n\n");
ArgStr:=AllocString(100);
{ --- Kommando holen --- }
GetParam(1,ArgStr);
If strlen(ArgStr)=0 then CleanExit(" No Args",5);
{ --- nach a..z konvertieren --- }
for i:=0 to strlen(ArgStr)-1 do
ArgStr[i]:=tolower(ArgStr[i]);
{ --- Check, ob zulässiges Kommando --- }
comm:=Cmd__Null;
If strcmp(ArgStr,"read") =0 then comm:=Cmd__Read;
If strcmp(ArgStr,"write") =0 then comm:=Cmd__Write;
If strcmp(ArgStr,"chk") =0 then comm:=Cmd__Chk;
If strcmp(ArgStr,"inst") =0 then comm:=Cmd__inst;
If strcmp(ArgStr,"cmp") =0 then comm:=Cmd__Cmp;
If strcmp(ArgStr,"type") =0 then comm:=Cmd__Type;
If strcmp(ArgStr,"kill") =0 then comm:=Cmd__Kill;
If strcmp(ArgStr,"test") =0 then comm:=Cmd__Test;
If strcmp(ArgStr,"?") =0 then comm:=Cmd__Help;
If comm=Cmd__Null then cleanexit(" Not valid command",5);
{ --- unit holen / df0..df3 = 0..3 --- }
If comm<>CMD__Help then begin
GetParam(2,ArgStr);
IF StrLen(ArgStr)=0 THEN CleanExit(" No Unit# [0..3]",5)
else begin
Case Byte(ArgStr^) of
48 : dfx := 0;
49 : dfx := 1; { 1. byte auf '0' - '3' testen }
50 : dfx := 2;
51 : dfx := 3;
Else
CleanExit(" Not valid unit number !",5);
End;
end;
End;
{ --- Ggf. File zum Schreiben/Lesen öffnen --- }
Case comm of
Cmd__Write,
Cmd__Cmp : OpenFile(Mode_OldFile);
Cmd__Read : OpenFile(Mode_NewFile);
End;
{ --- 1 K Chip-RAM reservieren : --- }
BB1:=BBPtr(AllocMem(1024,Memf_Chip));
If BB1=NIL then CleanExit(" Low on Chipmem !\n",10);
{ --- zus. 1 K RAM f. Vergleichs-BB o.ä. --- }
New(BB2);
{ --- Kommando ausführen : --- }
Case comm of
CMD__Read : { --- BB speichern --- }
begin
If not (RWBB(dfx, CMD__Read, BB1)) then Cleanexit(ErrorTD_IO,10);
If not (FileIO(CMD__Write, handle, BB1)) then CleanExit(DosErr_Wf, 10);
end;
CMD__Write : { --- install BB from file --- }
begin
If not (FileIO(CMD__Read, handle, BB1)) then CleanExit(DosErr_Rf ,10);
If not (RWBB(dfx, CMD__Write, BB1)) then Cleanexit(ErrorTD_IO,10);
end;
CMD__Chk : { --- check if Std.-BB --- }
begin
If not (RWBB(dfx, CMD__Read, BB1)) then Cleanexit(ErrorTD_IO,10);
InstantBB( BB2, 13 ); { Std.1.3-BB ? }
If ( CMPBB( BB1, BB2 ) ) then
Begin
write(" BB ok ( 1.3-BB)\n");
CleanExit( NIL, 0 );
End;
InstantBB( BB2, 20 ); { Std.2.0-BB ? }
If ( CMPBB( BB1, BB2 ) ) then
begin
write(" BB ok ( 2.0-BB)\n");
CleanExit( NIL, 0 );
End;
InstantBB( BB2, -1 ); { Not installed ? }
If ( CMPBB( BB1, BB2 ) ) then
begin
write(" Not installed disk\n");
CleanExit( NIL, 0 );
End;
CleanExit("
No Std.-BB!!
\n",10);
End;
CMD__inst : { --- install Std-BB, 1.3/2.0, je nach Kick --- }
begin
InstantBB( BB1, 0 );
If not (RWBB(dfx, CMD__Write, BB1)) then Cleanexit(ErrorTD_IO,10);
End;
CMD__Cmp : { --- BB vergleichen --- }
begin
If not (RWBB(dfx, CMD__Read, BB1)) then Cleanexit(ErrorTD_IO,10);
If not (FileIO(CMD__Read, handle, BB2)) then CleanExit(DosErr_Rf, 10);
If CmpBB( BB1, BB2 ) then
Begin
write(" BB equal 2 file\n\n"); { BB ok }
CleanExit(NIL,0);
End Else Begin
CleanExit(" BB -NOT- equal 2 file\n\n",10); { Different ! }
End;
End;
CMD__Type : { --- HexDump(BB) --- }
begin
If not (RWBB(dfx, CMD__Read, BB1)) then Cleanexit(ErrorTD_IO,10);
DumpBB;
end;
CMD__Kill : { --- Install -> NDOS --- }
begin
For i:=0 to 1023 do
BB1^[i]:=0;
If not (RWBB(dfx, CMD__Write, BB1)) then Cleanexit(ErrorTD_IO,10);
end;
CMD__Test : { --- BB testen - VORSICHT ! --- }
begin
If not (RWBB(dfx, CMD__Read, BB1)) then Cleanexit(ErrorTD_IO,10);
{ .... exec in a6, IOreq in a1, jsr bb^ , ... }
end;
CMD__Help : { --- How 2 use it --- }
begin
write( "Usage : DxBoot cmd unit[0..3] <filename>\n",
"Available commands are:\n",
" chk [unit#] 2 check if Std.-BB\n",
" read [unit#] BBfile 2 save a BootBlock\n",
" write [unit#] BBFile 2 install a BB\n",
" inst [unit#] 2 install a Std.-BB\n",
" cmp [unit#] BBFile 2 cmp 2 a BB-file\n",
" type [unit#] 4 a hexdump\n",
" test [unit#] 2 execute a bootblock (Be aware!)\n",
" kill [unit#] 2 get a NDOS-Disk\n",
" ? [unit#] 4 help\n\n");
end;
END;
Cleanexit(NIL,0); { --- Bye !! --- }
END. { bye bye GTI ...}